home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Gloom_3 / src / 020_1.s next >
Text File  |  1997-08-26  |  22KB  |  912 lines

  1.  
  2.         machine 68020
  3.  
  4. NEWCODE EQU 1
  5.  
  6.         bra.w    initc2p     ; offset 0: initialization routines
  7.         bra.w    doc2p_1X8    ; offset 4: one pixel wide version, AGA
  8.         bra.w    doc2p_1X6    ; offset 8: one pixel wide version, EHB
  9.         bra.w    doc2p_2X8    ; offset 12: two pixel wide version, AGA
  10.         bra.w    doc2p_2X6    ; offset 16: two pixel wide version, EHB
  11.         dc.l    string        ; offset 20: address of descr string
  12.  
  13.         dc.b    '$VER: 020_1 1.1 (26/8/97)',0
  14. string        dc.b    'A chunky to planar routine by Peter McGavin. '
  15.         dc.b    'Changes By Iain Barclay. '
  16.         dc.b    'Optimised for 68020. '
  17.         dc.b    'Supports 6/8 bitplane, single/double width pixels.',0
  18.         even
  19.  
  20. initc2p
  21.  
  22. ; create 2 tables for Gloom
  23.  
  24. ; a0=columns buffer to fill in (array of longs) for 1 wide pixs.
  25. ; a1=columns buffer for 2 wide pixs
  26. ; d0=how many columns (multiple of 32)
  27. ; a2=palette remapping array (do 256)
  28.  
  29.         move.w    #255,d1 ;#colours-1
  30. .loop        move.b    d1,(a2,d1.w)
  31.         dbf    d1,.loop
  32.  
  33. ; column offsets for 1 wide pixels
  34.  
  35. ; 0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15,
  36. ; 16,18,20,...
  37.  
  38.         move.l    d0,d4
  39.         lsr.w    #4,d4
  40.         subq.w    #1,d4
  41.         moveq    #0,d1
  42. .loop0        moveq    #1,d2
  43. .loop1        moveq    #7,d3
  44. .loop2        move.l    d1,(a0)+
  45.         addq.l    #2,d1
  46.         dbf    d3,.loop2
  47.         sub.l    #15,d1
  48.         dbf    d2,.loop1
  49.         add.l    #14,d1
  50.         dbf    d4,.loop0
  51.  
  52. ; column offsets for 2 wide pixels
  53.  
  54. ; 0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15,
  55. ; 16,20,24,28,17,...
  56.  
  57.         lsr.w    #4,d0
  58.         subq.w    #1,d0
  59.         moveq    #0,d1
  60. .loop3        moveq    #3,d2
  61. .loop4        moveq    #3,d3
  62. .loop5        move.l    d1,(a1)+
  63.         addq.l    #4,d1
  64.         dbf    d3,.loop5
  65.         sub.l    #15,d1
  66.         dbf    d2,.loop4
  67.         add.l    #12,d1
  68.         dbf    d0,.loop3
  69.         rts
  70.  
  71.         cnop    0,4
  72. doc2p_1X8
  73. ; inputs:
  74. ; a0.l=src chunky buffer
  75. ; a1.l=dest chipmem bitmap
  76. ; d0.w=width (in pixels - multiple of 32) to convert
  77. ; d1.w=height (in pixels - even)
  78. ; d2.l=modulo from one bitplane to next (copmod-ish)
  79. ; d3.l=modulo from start of one line to start of next (linemod)
  80.  
  81.         movea.l d2,a5        ; a5 = bpmod
  82.         lsl.l    #3,d2
  83.         sub.l    a5,d2
  84.         subq.l    #2,d2
  85.         movea.l d2,a6        ; a6 = 7*bpmod-2
  86.  
  87.         lsr.w    #4,d0
  88.         ext.l    d0
  89.         move.l    d0,d4
  90.         subq.l    #1,d4
  91.         move.l    d4,-(sp)    ; (4,sp) = num of 16 pix per row - 1
  92.  
  93.         add.l    d0,d0        ; num of 8 pix per row (bytesperrow)
  94.         sub.l    d0,d3
  95.         sub.l    a6,d3
  96.         move.l    d3,-(sp)    ; (sp) = linemod-bytesperrow-7*bpmod+2
  97.  
  98.         move.w    d1,d7
  99.         subq.w    #1,d7        ; d7 = height-1
  100.  
  101.         movea.l #$f0f0f0f0,a2    ; a2 = 4 bit mask
  102.         movea.l #$cccccccc,a3    ; a3 = 2 bit mask
  103.         movea.l #$aaaa5555,a4    ; a4 = 1 bit mask
  104.         move.l    a2,d6        ; 4 bit mask = #$f0f0f0f0
  105.  
  106. ;------------------------------------------------------------------------
  107. ;
  108. ; 00        a7a6a5a4a3a2a1a0 i7i6i5i4i3i2i1i0 b7b6b5b4b3b2b1b0 j7j6j5j4j3j2j1j0
  109. ; 01        c7c6c5c4c3c2c1c0 k7k6k5k4k3k2k1k0 d7d6d5d4d3d2d1d0 l7l6l5l4l3l2l1l0
  110. ; 02        e7e6e5e4e3e2e1e0 m7m6m5m4m3m2m1m0 f7f6f5f4f3f2f1f0 n7n6n5n4n3n2n1n0
  111. ; 03        g7g6g5g4g3g2g1g0 o7o6o5o4o3o2o1o0 h7h6h5h4h3h2h1h0 p7p6p5p4p3p2p1p0
  112. ;
  113. ; 10 00x02a a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4 b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4
  114. ; 11 00x02b a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0
  115. ; 12 01x03a c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4 d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4
  116. ; 13 01x03b c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0 d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  117. ;
  118. ; 20 10x12a a7a6c7c6e7e6g7g6 i7i6k7k6m7m6o7o6 b7b6d7d6f7f6h7h6 j7j6l7l6n7n6p7p6
  119. ; 21 10x12b a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4 b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4
  120. ;
  121. ; 30 20x20  a7b7c7d7e7f7g7h7 i7j7k7l7m7n7o7p7 a6b6c6d6e6f6g6h6 i6j6k6l6m6n6o6p6
  122. ; 31 21x21  a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5 a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4
  123. ;
  124. ; 22 11x13a a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2 b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  125. ; 23 11x13b a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0 b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  126. ;
  127. ; 32 22x22  a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3 a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  128. ; 33 23x23  a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1 a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  129. ;
  130. ;------------------------------------------------------------------------
  131.  
  132.         swap    d7
  133.         move.w    d4,d7        ; num 16 pix per row - 1
  134.  
  135.         move.l    (a0)+,d0    ; get first 4 pixels 00
  136.         move.l    (a0)+,d1    ; get first 4 pixels 01
  137.         move.l    (a0)+,d2    ; get first 4 pixels 02
  138.         move.l    (a0)+,d3    ; get first 4 pixels 03
  139.  
  140.         move.l    d0,d4
  141.         and.l    d6,d0
  142.         eor.l    d0,d4
  143.         lsl.l    #4,d4
  144.  
  145.         bra.b    .same_from_here
  146.  
  147.         cnop    0,4
  148.  
  149. .outerloop    swap    d7
  150.         move.w    (6,sp),d7    ; num 16 pix per row - 1
  151.  
  152.         move.l    (a0)+,d0    ; get 4 next pixels 00
  153.         move.l    (a0)+,d1    ; get 4 next pixels 01
  154.         move.l    (a0)+,d2    ; get 4 next pixels 02
  155.         move.l    (a0)+,d3    ; get 4 next pixels 03
  156.  
  157.         move.w    d5,(a1)     ; 30 -> plane 6
  158.         adda.l    a5,a1        ; +bpmod
  159.         swap    d5
  160.  
  161.         move.l    d0,d4
  162.         and.l    d6,d0
  163.         eor.l    d0,d4
  164.         lsl.l    #4,d4
  165.  
  166.         move.w    d5,(a1)     ; 30 -> plane 7
  167.         adda.l    (sp),a1     ; +linemod-bytesperrow-7*bpmod+2
  168.  
  169.         bra.b    .same_from_here
  170.  
  171.         cnop    0,4
  172. .innerloop    move.l    (a0)+,d0    ; get 4 next pixels 00
  173.         move.l    (a0)+,d1    ; get 4 next pixels 01
  174.         move.l    (a0)+,d2    ; get 4 next pixels 02
  175.         move.l    (a0)+,d3    ; get 4 next pixels 03
  176.  
  177.         move.w    d5,(a1)     ; 30 -> plane 6
  178.         adda.l    a5,a1        ; +bpmod
  179.         swap    d5
  180.  
  181.         move.l    d0,d4
  182.         and.l    d6,d0
  183.         eor.l    d0,d4
  184.         lsl.l    #4,d4
  185.  
  186.         move.w    d5,(a1)     ; 30 -> plane 7
  187.         suba.l    a6,a1        ; - 7 * bpmod + 2
  188.  
  189. .same_from_here move.l    d2,d5
  190.         and.l    d6,d5
  191.         eor.l    d5,d2
  192.         lsr.l    #4,d5
  193.         or.l    d5,d0
  194.         or.l    d4,d2        ; 00x02 -> 10 11
  195.         move.l    d1,d4
  196.         and.l    d6,d1
  197.         eor.l    d1,d4
  198.         move.l    d3,d5
  199.         and.l    d6,d5
  200.         eor.l    d5,d3
  201.         lsr.l    #4,d5
  202.         lsl.l    #4,d4
  203.         or.l    d5,d1
  204.         or.l    d4,d3        ; 01x03 -> 12 13
  205.         move.l    a3,d6        ; 2 bit mask = #$cccccccc
  206.         move.l    d2,d4
  207.         and.l    d6,d2
  208.         eor.l    d2,d4
  209.         move.l    d3,d5
  210.         and.l    d6,d5
  211.         eor.l    d5,d3
  212.         lsl.l    #2,d4
  213.         or.l    d4,d3        ; 11x13b -> 23
  214.         move.l    a4,d6        ; 1 bit mask = #$aaaa5555
  215.         move.l    d3,d4
  216.         and.l    d6,d3
  217.         eor.l    d3,d4
  218.         lsr.w    #1,d4
  219.         swap    d4
  220.         add.w    d4,d4
  221.         or.l    d4,d3        ; 23x23 -> 33
  222.  
  223.         move.w    d3,(a1)     ; 33 -> plane 0
  224.         adda.l    a5,a1        ; +bpmod
  225.  
  226.         lsr.l    #2,d5
  227.         or.l    d5,d2        ; 11x13a -> 22
  228.         move.l    d2,d4
  229.         and.l    d6,d2
  230.         eor.l    d2,d4
  231.         lsr.w    #1,d4
  232.  
  233.         swap    d3
  234.         move.w    d3,(a1)     ; 33 -> plane 1
  235.         adda.l    a5,a1        ; +bpmod
  236.  
  237.         swap    d4
  238.         add.w    d4,d4
  239.         or.l    d4,d2        ; 22x22 -> 32
  240.         move.l    a3,d6        ; 2 bit mask = #$cccccccc
  241.         move.l    d0,d4
  242.         and.l    d6,d0
  243.         eor.l    d0,d4
  244.  
  245.         move.w    d2,(a1)     ; 32 -> plane 2
  246.         adda.l    a5,a1        ; +bpmod
  247.  
  248.         move.l    d1,d5
  249.         and.l    d6,d5
  250.         eor.l    d5,d1
  251.         lsl.l    #2,d4
  252.         or.l    d4,d1        ; 10x12b -> 21
  253.         move.l    a4,d6        ; 1 bit mask = #$aaaa5555
  254.  
  255.         swap    d2
  256.         move.w    d2,(a1)     ; 32 -> plane 3
  257.         adda.l    a5,a1        ; +bpmod
  258.  
  259.         move.l    d1,d4
  260.         and.l    d6,d1
  261.         eor.l    d1,d4
  262.         lsr.w    #1,d4
  263.         swap    d4
  264.         add.w    d4,d4
  265.         or.l    d4,d1        ; 21x21 -> 31
  266.  
  267.         move.w    d1,(a1)     ; 31 -> plane 4
  268.         adda.l    a5,a1        ; +bpmod
  269.  
  270.         lsr.l    #2,d5
  271.         or.l    d5,d0        ; 10x12a -> 20
  272.         move.l    d0,d5
  273.         and.l    d6,d0
  274.         eor.l    d0,d5
  275.  
  276.         swap    d1
  277.         move.w    d1,(a1)     ; 31 -> plane 5
  278.         adda.l    a5,a1        ; +bpmod
  279.  
  280.         lsr.w    #1,d5
  281.         swap    d5
  282.         add.w    d5,d5
  283.         or.l    d0,d5        ; 20x20 -> 30
  284.  
  285.         move.l    a2,d6        ; 4 bit mask = #$f0f0f0f0
  286.  
  287.         dbra    d7,.innerloop
  288.  
  289.         swap    d7
  290.         dbra    d7,.outerloop
  291.  
  292.         move.w    d5,(a1)     ; 30 -> plane 6
  293.         adda.l    a5,a1        ; +bpmod
  294.         swap    d5
  295.         move.w    d5,(a1)     ; 30 -> plane 7
  296.         addq.l    #8,sp        ; remove locals
  297.         rts
  298.  
  299.         cnop    0,4
  300. doc2p_1X6
  301. ; inputs:
  302. ; a0.l=src chunky buffer
  303. ; a1.l=dest chipmem bitmap
  304. ; d0.w=width (in pixels - multiple of 32) to convert
  305. ; d1.w=height (in pixels - even)
  306. ; d2.l=modulo from one bitplane to next (copmod-ish)
  307. ; d3.l=modulo from start of one line to start of next (linemod)
  308.  
  309.         movea.l d2,a5        ; a5 = bpmod
  310.         lsl.l    #2,d2
  311.         add.l    a5,d2
  312.         subq.l    #2,d2
  313.         movea.l d2,a6        ; a6 = 5*bpmod-2
  314.  
  315.         lsr.w    #4,d0
  316.         ext.l    d0
  317.         move.l    d0,d4
  318.         subq.l    #1,d4
  319.         move.l    d4,-(sp)    ; (4,sp) = num of 16 pix per row - 1
  320.  
  321.         add.l    d0,d0        ; num of 8 pix per row (bytesperrow)
  322.         sub.l    d0,d3
  323.         sub.l    a6,d3
  324.         move.l    d3,-(sp)    ; (sp) = linemod-bytesperrow-5*bpmod+2
  325.  
  326.         move.w    d1,d7
  327.         subq.w    #1,d7        ; d7 = height-1
  328.  
  329.         movea.l #$f0f0f0f0,a2    ; a2 = 4 bit mask
  330.         movea.l #$cccccccc,a3    ; a3 = 2 bit mask
  331.         movea.l #$aaaa5555,a4    ; a4 = 1 bit mask
  332.         move.l    a2,d6        ; 4 bit mask = #$f0f0f0f0
  333.  
  334. ;------------------------------------------------------------------------
  335. ;
  336. ; 00        ....a5a4a3a2a1a0 ....i5i4i3i2i1i0 ....b5b4b3b2b1b0 ....j5j4j3j2j1j0
  337. ; 01        ....c5c4c3c2c1c0 ....k5k4k3k2k1k0 ....d5d4d3d2d1d0 ....l5l4l3l2l1l0
  338. ; 02        ....e5e4e3e2e1e0 ....m5m4m3m2m1m0 ....f5f4f3f2f1f0 ....n5n4n3n2n1n0
  339. ; 03        ....g5g4g3g2g1g0 ....o5o4o3o2o1o0 ....h5h4h3h2h1h0 ....p5p4p3p2p1p0
  340. ;
  341. ; 10 00x02a ....a5a4....e5e4 ....i5i4....m5m4 ....b5b4....f5f4 ....j5j4....n5n4
  342. ; 11 00x02b a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0
  343. ; 12 01x03a ....c5c4....g5g4 ....k5k4....o5o4 ....d5d4....h5h4 ....l5l4....p5p4
  344. ; 13 01x03b c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0 d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  345. ;
  346. ; 21 10x12b a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4 b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4
  347. ;
  348. ; 31 21x21  a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5 a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4
  349. ;
  350. ; 22 11x13a a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2 b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  351. ; 23 11x13b a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0 b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  352. ;
  353. ; 32 22x22  a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3 a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  354. ; 33 23x23  a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1 a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  355. ;
  356. ;------------------------------------------------------------------------
  357.  
  358.         swap    d7
  359.         move.w    d4,d7        ; num 16 pix per row - 1
  360.  
  361.         move.l    (a0)+,d0    ; get first 4 pixels 00
  362.         move.l    (a0)+,d1    ; get first 4 pixels 01
  363.         move.l    (a0)+,d2    ; get first 4 pixels 02
  364.         move.l    (a0)+,d3    ; get first 4 pixels 03
  365.  
  366.         move.l    d0,d4
  367.         and.l    d6,d0
  368.         eor.l    d0,d4
  369.         lsl.l    #4,d4
  370.  
  371.         bra.b    .same_from_here
  372.  
  373.         cnop    0,4
  374.  
  375. .outerloop    swap    d7
  376.         move.w    (6,sp),d7    ; num 16 pix per row - 1
  377.  
  378.         move.l    (a0)+,d0    ; get 4 next pixels 00
  379.         move.l    (a0)+,d1    ; get 4 next pixels 01
  380.         move.l    (a0)+,d2    ; get 4 next pixels 02
  381.         move.l    (a0)+,d3    ; get 4 next pixels 03
  382.  
  383.         move.w    d5,(a1)     ; 31 -> plane 4
  384.         adda.l    a5,a1        ; +bpmod
  385.  
  386.         move.l    d0,d4
  387.         and.l    d6,d0
  388.         eor.l    d0,d4
  389.         lsl.l    #4,d4
  390.  
  391.         swap    d5
  392.         move.w    d5,(a1)     ; 31 -> plane 5
  393.         adda.l    (sp),a1     ; +linemod-bytesperrow-5*bpmod+2
  394.  
  395.         bra.b    .same_from_here
  396.  
  397.         cnop    0,4
  398. .innerloop    move.l    (a0)+,d0    ; get 4 next pixels 00
  399.         move.l    (a0)+,d1    ; get 4 next pixels 01
  400.         move.l    (a0)+,d2    ; get 4 next pixels 02
  401.         move.l    (a0)+,d3    ; get 4 next pixels 03
  402.  
  403.         move.w    d5,(a1)     ; 31 -> plane 4
  404.         adda.l    a5,a1        ; +bpmod
  405.  
  406.         move.l    d0,d4
  407.         and.l    d6,d0
  408.         eor.l    d0,d4
  409.         lsl.l    #4,d4
  410.  
  411.         swap    d5
  412.         move.w    d5,(a1)     ; 31 -> plane 5
  413.         suba.l    a6,a1        ; -5*bpmod+2
  414.  
  415. .same_from_here move.l    d2,d5
  416.         and.l    d6,d5
  417.         eor.l    d5,d2
  418.         lsr.l    #4,d5
  419.         or.l    d5,d0
  420.         or.l    d4,d2        ; 00x02 -> 10 11
  421.         move.l    d1,d4
  422.         and.l    d6,d1
  423.         eor.l    d1,d4
  424.         move.l    d3,d5
  425.         and.l    d6,d5
  426.         eor.l    d5,d3
  427.         lsr.l    #4,d5
  428.         lsl.l    #4,d4
  429.         or.l    d5,d1
  430.         or.l    d4,d3        ; 01x03 -> 12 13
  431.         move.l    a3,d6        ; 2 bit mask = #$cccccccc
  432.         move.l    d2,d4
  433.         and.l    d6,d2
  434.         eor.l    d2,d4
  435.         move.l    d3,d5
  436.         and.l    d6,d5
  437.         eor.l    d5,d3
  438.         lsl.l    #2,d4
  439.         or.l    d4,d3        ; 11x13b -> 23
  440.         move.l    a4,d6        ; 1 bit mask = #$aaaa5555
  441.         move.l    d3,d4
  442.         and.l    d6,d3
  443.         eor.l    d3,d4
  444.         lsr.w    #1,d4
  445.         swap    d4
  446.         add.w    d4,d4
  447.         or.l    d4,d3        ; 23x23 -> 33
  448.  
  449.         move.w    d3,(a1)     ; 33 -> plane 0
  450.         adda.l    a5,a1        ; +bpmod
  451.  
  452.         lsr.l    #2,d5
  453.         or.l    d5,d2        ; 11x13a -> 22
  454.         move.l    d2,d4
  455.         and.l    d6,d2
  456.         eor.l    d2,d4
  457.  
  458.         swap    d3
  459.         move.w    d3,(a1)     ; 33 -> plane 1
  460.         adda.l    a5,a1        ; +bpmod
  461.  
  462.         lsr.w    #1,d4
  463.         swap    d4
  464.         add.w    d4,d4
  465.         or.l    d4,d2        ; 22x22 -> 32
  466.         lsl.l    #2,d0
  467.  
  468.         move.w    d2,(a1)     ; 32 -> plane 2
  469.         adda.l    a5,a1        ; +bpmod
  470.  
  471.         or.l    d0,d1        ; 10x12b -> 21
  472.         swap    d2
  473.         move.l    d1,d5
  474.         and.l    d6,d1
  475.         eor.l    d1,d5
  476.  
  477.         move.w    d2,(a1)     ; 32 -> plane 3
  478.         adda.l    a5,a1        ; +bpmod
  479.  
  480.         lsr.w    #1,d5
  481.         swap    d5
  482.         add.w    d5,d5
  483.         or.l    d1,d5        ; 21x21 -> 31
  484.         move.l    a2,d6        ; 4 bit mask = #$f0f0f0f0
  485.  
  486.         dbra    d7,.innerloop
  487.  
  488.         swap    d7
  489.         dbra    d7,.outerloop
  490.  
  491.         move.w    d5,(a1)     ; 31 -> plane 4
  492.         adda.l    a5,a1        ; +bpmod
  493.         swap    d5
  494.         move.w    d5,(a1)     ; 31 -> plane 5
  495.         addq.l    #8,sp        ; remove locals
  496.         rts
  497.  
  498.         cnop    0,4
  499. doc2p_2X8
  500. ; inputs:
  501. ; a0.l=src chunky buffer
  502. ; a1.l=dest chipmem bitmap
  503. ; d0.w=width (in pixels - multiple of 32) to convert
  504. ; d1.w=height (in pixels - even)
  505. ; d2.l=modulo from one bitplane to next (copmod-ish)
  506. ; d3.l=modulo from start of one line to start of next (linemod)
  507.  
  508.         movea.l d2,a6        ; a6 = bpmod
  509.         move.l    d2,d4
  510.         lsl.l    #3,d4
  511.         sub.l    d2,d4
  512.         neg.l    d4
  513.         addq.l    #4,d4
  514.         movea.l d4,a3        ; a3 = -7*bpmod+4
  515.         movea.l d4,a4        ; a4 = -7*bpmod+4
  516.         lsr.w    #4,d0
  517.         movea.w d0,a2
  518.         subq.l    #1,a2        ; a2 = num 16 pix per row - 1
  519.         lsl.w    #2,d0        ; d0 = num 4 pix per row (bytesperrow)
  520.         movea.l d3,a5
  521.         suba.w    d0,a5
  522.         adda.l    a3,a5        ; a5 = linemod-bytesperrow-7*bpmod+4
  523.         move.w    d1,d7
  524.         subq.w    #1,d7        ; d7 = height - 1
  525.  
  526. ;------------------------------------------------------------------------
  527. ; original pixels
  528. ; 00        a7a6a5a4a3a2a1a0 e7e6e5e4e3e2e1e0 i7i6i5i4i3i2i1i0 m7m6m5m4m3m2m1m0
  529. ; 01        b7b6b5b4b3b2b1b0 f7f6f5f4f3f2f1f0 j7j6j5j4j3j2j1j0 n7n6n5n4n3n2n1n0
  530. ; 02        c7c6c5c4c3c2c1c0 g7g6g5g4g3g2g1g0 k7k6k5k4k3k2k1k0 o7o6o5o4o3o2o1o0
  531. ; 03        d7d6d5d4d3d2d1d0 h7h6h5h4h3h2h1h0 l7l6l5l4l3l2l1l0 p7p6p5p4p3p2p1p0
  532. ;
  533. ; after 4bit merge
  534. ; 10 00x02a a7a6a5a4c7c6c5c4 e7e6e5e4g7g6g5g4 i7i6i5i4k7k6k5k4 m7m6m5m4o7o6o5o4
  535. ; 11 00x02b a3a2a1a0c3c2c1c0 e3e2e1e0g3g2g1g0 i3i2i1i0k3k2k1k0 m3m2m1m0o3o2o1o0
  536. ; 12 01x03a b7b6b5b4d7d6d5d4 f7f6f5f4h7h6h5h4 j7j6j5j4l7l6l5l4 n7n6n5n4p7p6p5p4
  537. ; 13 01x03b b3b2b1b0d3d2d1d0 f3f2f1f0h3h2h1h0 j3j2j1j0l3l2l1l0 n3n2n1n0p3p2p1p0
  538. ;
  539. ; after 2bit merge
  540. ; 20 10x12a a7a6b7b6c7c6d7d6 e7e6f7f6g7g6h7h6 i7i6j7j6k7k6l7l6 m7m6n7n6o7o6p7p6
  541. ; 21 10x12b a5a4b5b4c5c4d5d4 e5e4f5f4g5g4h5h4 i5i4j5j4k5k4l5l4 m5m4n5n4o5o4p5p4
  542. ; 22 11x13a a3a2b3b2c3c2d3d2 e3e2f3f2g3g2h3h2 i3i2j3j2k3k2l3l2 m3m2n3n2o3o2p3p2
  543. ; 23 11x13b a1a0b1b0c1c0d1d0 e1e0f1f0g1g0h1h0 i1i0j1j0k1k0l1l0 m1m0n1n0o1o0p1p0
  544. ;
  545. ; after 1bit merge
  546. ; 30 20x20a a7a7b7b7c7c7d7d7 e7e7f7f7g7g7h7h7 i7i7j7j7k7k7l7l7 m7m7n7n7o7o7p7p7
  547. ; 31 20x20b a6a6b6b6c6c6d6d6 e6e6f6f6g6g6h6h6 i6i6j6j6k6k6l6l6 m6m6n6n6o6o6p6p6
  548. ; 32 21x21a a5a5b5b5c5c5d5d5 e5e5f5f5g5g5h5h5 i5i5j5j5k5k5l5l5 m5m5n5n5o5o5p5p5
  549. ; 33 21x21b a4a4b4b4c4c4d4d4 e4e4f4f4g4g4h4h4 i4i4j4j4k4k4l4l4 m4m4n4n4o4o4p4p4
  550. ; 34 22x22a a3a3b3b3c3c3d3d3 e3e3f3f3g3g3h3h3 i3i3j3j3k3k3l3l3 m3m3n3n3o3o3p3p3
  551. ; 35 22x22b a2a2b2b2c2c2d2d2 e2e2f2f2g2g2h2h2 i2i2j2j2k2k2l2l2 m2m2n2n2o2o2p2p2
  552. ; 36 23x23a a1a1b1b1c1c1d1d1 e1e1f1f1g1g1h1h1 i1i1j1j1k1k1l1l1 m1m1n1n1o1o1p1p1
  553. ; 37 23x23b a0a0b0b0c0c0d0d0 e0e0f0f0g0g0h0h0 i0i0j0j0k0k0l0l0 m0m0n0n0o0o0p0p0
  554. ;------------------------------------------------------------------------
  555.  
  556.         swap    d7
  557.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  558.  
  559.         move.l    (a0)+,d0    ; read first 12 (game) pixels
  560.         move.l    (a0)+,d1
  561.         move.l    (a0)+,d2
  562.         move.l    #$f0f0f0f0,d6
  563.  
  564.         move.l    d0,d4
  565.         move.l    d2,d5
  566.         and.l    d6,d0        ; #$f0f0f0f0
  567.         eor.l    d0,d4
  568.         lsl.l    #4,d4
  569.         and.l    d6,d5        ; #$f0f0f0f0
  570.         eor.l    d5,d2
  571.         lsr.l    #4,d5
  572.         or.l    d5,d0
  573.         or.l    d4,d2        ; 00x02 -> 10 11
  574.  
  575.         bra    .same_from_here
  576.  
  577.         cnop    0,4
  578.  
  579. .outerloop    swap    d7
  580.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  581.  
  582. .innerloop    move.l    (a0)+,d0    ; read next 12 (game) pixels
  583.         move.l    (a0)+,d1
  584.         move.l    (a0)+,d2
  585.         move.l    d6,(a1)     ; 32 -> plane 5
  586.         adda.l    a6,a1        ; +bpmod
  587.  
  588.         move.l    #$f0f0f0f0,d6
  589.  
  590.         move.l    d0,d4
  591.         and.l    d6,d0        ; #$f0f0f0f0
  592.         eor.l    d0,d4
  593.         lsl.l    #4,d4
  594.  
  595.         move.l    d5,(a1)     ; 31 -> plane 6
  596.         adda.l    a6,a1        ; +bpmod
  597.  
  598.         move.l    d2,d5
  599.         and.l    d6,d5        ; #$f0f0f0f0
  600.         eor.l    d5,d2
  601.         lsr.l    #4,d5
  602.         or.l    d5,d0
  603.         or.l    d4,d2        ; 00x02 -> 10 11
  604.  
  605.         move.l    d3,(a1)     ; 30 -> plane 7
  606.         adda.l    a4,a1        ; -7*bpmod+4 or
  607.                     ; +linemod-bytesperrow-7*bpmod+4
  608.  
  609. .same_from_here move.l    d1,d4
  610.         and.l    d6,d1        ; #$f0f0f0f0
  611.         eor.l    d1,d4
  612.         lsl.l    #4,d4
  613.  
  614.         move.l    (a0)+,d3    ; read next 4 (game) pixels
  615.  
  616.         move.l    d3,d5
  617.         and.l    d6,d5        ; #$f0f0f0f0
  618.         eor.l    d5,d3
  619.         lsr.l    #4,d5
  620.         or.l    d5,d1
  621.         or.l    d4,d3        ; 01x03 -> 12 13
  622.  
  623.         move.l    #$cccccccc,d6
  624.  
  625.         move.l    d0,d4
  626.         and.l    d6,d0        ; #$cccccccc
  627.         eor.l    d0,d4
  628.         lsl.l    #2,d4
  629.         move.l    d1,d5
  630.         and.l    d6,d5        ; #$cccccccc
  631.         eor.l    d5,d1
  632.         lsr.l    #2,d5
  633.         or.l    d5,d0
  634.         or.l    d4,d1        ; 10x12 -> 20 21
  635.  
  636.         move.l    d2,d4
  637.         and.l    d6,d2        ; #$cccccccc
  638.         eor.l    d2,d4
  639.         lsl.l    #2,d4
  640.         move.l    d3,d5
  641.         and.l    d6,d5        ; #$cccccccc
  642.         eor.l    d5,d3
  643.         lsr.l    #2,d5
  644.         or.l    d5,d2
  645.         or.l    d4,d3        ; 11x13 -> 22 23
  646.  
  647.         move.l    #$aaaaaaaa,d6
  648.  
  649.         move.l    d3,d4
  650.         and.l    d6,d3        ; #$aaaaaaaa
  651.         eor.l    d3,d4
  652.  
  653.         move.l    d4,d5
  654.         add.l    d4,d4
  655.         or.l    d4,d5        ; 23x23b -> 37
  656.  
  657.         move.l    d5,(a1)     ; 37 -> plane 0
  658.         adda.l    a6,a1        ; +bpmod
  659.  
  660.         move.l    d3,d4
  661.         lsr.l    #1,d3
  662.         or.l    d3,d4        ; 23x23a -> 36
  663.         move.l    d2,d5
  664.         and.l    d6,d2        ; #$aaaaaaaa
  665.         eor.l    d2,d5
  666.  
  667.         move.l    d4,(a1)     ; 36 -> plane 1
  668.         adda.l    a6,a1        ; +bpmod
  669.  
  670.         move.l    d5,d3
  671.         add.l    d5,d5
  672.         or.l    d5,d3        ; 22x22b -> 35
  673.         move.l    d2,d5
  674.         lsr.l    #1,d2
  675.         or.l    d5,d2        ; 22x22a -> 34
  676.  
  677.         move.l    d3,(a1)     ; 35 -> plane 2
  678.         adda.l    a6,a1        ; +bpmod
  679.  
  680.         move.l    d1,d4
  681.         and.l    d6,d1        ; #$aaaaaaaa
  682.         eor.l    d1,d4
  683.         move.l    d0,d5
  684.         and.l    d6,d0        ; #$aaaaaaaa
  685.         eor.l    d0,d5
  686.  
  687.         move.l    d2,(a1)     ; 34 -> plane 3
  688.         adda.l    a6,a1        ; +bpmod
  689.  
  690.         move.l    d4,d2
  691.         add.l    d4,d4
  692.         or.l    d4,d2        ; 21x21b -> 33
  693.         move.l    d1,d6
  694.         lsr.l    #1,d1
  695.         or.l    d1,d6        ; 21x21a -> 32
  696.         move.l    d5,d3
  697.  
  698.         move.l    d2,(a1)     ; 33 -> plane 4
  699.         adda.l    a6,a1        ; +bpmod
  700.  
  701.         add.l    d5,d5
  702.         or.l    d3,d5        ; 20x20b -> 31
  703.         move.l    d0,d3
  704.         lsr.l    #1,d0
  705.         or.l    d0,d3        ; 20x20a -> 30
  706.  
  707.         movea.l a3,a4        ; a4 = -7*bpmod+4
  708.  
  709.         dbra    d7,.innerloop
  710.  
  711.         movea.l a5,a4        ; a4 = linemod-bytesperrow-7*bpmod+4
  712.  
  713.         swap    d7
  714.         dbra    d7,.outerloop
  715.  
  716.         move.l    d6,(a1)     ; 32 -> plane 5
  717.         adda.l    a6,a1        ; +bpmod
  718.         move.l    d5,(a1)     ; 31 -> plane 6
  719.         adda.l    a6,a1        ; +bpmod
  720.         move.l    d3,(a1)     ; 30 -> plane 7
  721.         rts
  722.  
  723.         cnop    0,4
  724. doc2p_2X6
  725. ; inputs:
  726. ; a0.l=src chunky buffer
  727. ; a1.l=dest chipmem bitmap
  728. ; d0.w=width (in pixels - multiple of 32) to convert
  729. ; d1.w=height (in pixels - even)
  730. ; d2.l=modulo from one bitplane to next (copmod-ish)
  731. ; d3.l=modulo from start of one line to start of next (linemod)
  732.  
  733.         movea.l d2,a6        ; a6 = bpmod
  734.         move.l    d2,d4
  735.         lsl.l    #2,d4
  736.         add.l    d2,d4
  737.         neg.l    d4
  738.         addq.l    #4,d4
  739.         movea.l d4,a3        ; a3 = -5*bpmod+4
  740.         movea.l d4,a4        ; a4 = -5*bpmod+4
  741.         lsr.w    #4,d0
  742.         movea.w d0,a2
  743.         subq.l    #1,a2        ; a2 = num 16 pix per row - 1
  744.         lsl.w    #2,d0        ; d0 = num 4 pix per row (bytesperrow)
  745.         movea.l d3,a5
  746.         suba.w    d0,a5
  747.         adda.l    a3,a5        ; a5 = linemod-bytesperrow-5*bpmod+4
  748.         move.w    d1,d7
  749.         subq.w    #1,d7        ; d7 = height - 1
  750.  
  751. ;------------------------------------------------------------------------
  752. ; original pixels
  753. ; 00        ....a5a4a3a2a1a0 ....e5e4e3e2e1e0 ....i5i4i3i2i1i0 ....m5m4m3m2m1m0
  754. ; 01        ....b5b4b3b2b1b0 ....f5f4f3f2f1f0 ....j5j4j3j2j1j0 ....n5n4n3n2n1n0
  755. ; 02        ....c5c4c3c2c1c0 ....g5g4g3g2g1g0 ....k5k4k3k2k1k0 ....o5o4o3o2o1o0
  756. ; 03        ....d5d4d3d2d1d0 ....h5h4h3h2h1h0 ....l5l4l3l2l1l0 ....p5p4p3p2p1p0
  757. ;
  758. ; after 4bit merge
  759. ; 10 00x02a ....a5a4....c5c4 ....e5e4....g5g4 ....i5i4....k5k4 ....m5m4....o5o4
  760. ; 11 00x02b a3a2a1a0c3c2c1c0 e3e2e1e0g3g2g1g0 i3i2i1i0k3k2k1k0 m3m2m1m0o3o2o1o0
  761. ; 12 01x03a ....b5b4....d5d4 ....f5f4....h5h4 ....j5j4....l5l4 ....n5n4....p5p4
  762. ; 13 01x03b b3b2b1b0d3d2d1d0 f3f2f1f0h3h2h1h0 j3j2j1j0l3l2l1l0 n3n2n1n0p3p2p1p0
  763. ;
  764. ; after 2bit merge
  765. ; 21 10x12b a5a4b5b4c5c4d5d4 e5e4f5f4g5g4h5h4 i5i4j5j4k5k4l5l4 m5m4n5n4o5o4p5p4
  766. ; 22 11x13a a3a2b3b2c3c2d3d2 e3e2f3f2g3g2h3h2 i3i2j3j2k3k2l3l2 m3m2n3n2o3o2p3p2
  767. ; 23 11x13b a1a0b1b0c1c0d1d0 e1e0f1f0g1g0h1h0 i1i0j1j0k1k0l1l0 m1m0n1n0o1o0p1p0
  768. ;
  769. ; after 1bit merge
  770. ; 32 21x21a a5a5b5b5c5c5d5d5 e5e5f5f5g5g5h5h5 i5i5j5j5k5k5l5l5 m5m5n5n5o5o5p5p5
  771. ; 33 21x21b a4a4b4b4c4c4d4d4 e4e4f4f4g4g4h4h4 i4i4j4j4k4k4l4l4 m4m4n4n4o4o4p4p4
  772. ; 34 22x22a a3a3b3b3c3c3d3d3 e3e3f3f3g3g3h3h3 i3i3j3j3k3k3l3l3 m3m3n3n3o3o3p3p3
  773. ; 35 22x22b a2a2b2b2c2c2d2d2 e2e2f2f2g2g2h2h2 i2i2j2j2k2k2l2l2 m2m2n2n2o2o2p2p2
  774. ; 36 23x23a a1a1b1b1c1c1d1d1 e1e1f1f1g1g1h1h1 i1i1j1j1k1k1l1l1 m1m1n1n1o1o1p1p1
  775. ; 37 23x23b a0a0b0b0c0c0d0d0 e0e0f0f0g0g0h0h0 i0i0j0j0k0k0l0l0 m0m0n0n0o0o0p0p0
  776. ;------------------------------------------------------------------------
  777.  
  778.         swap    d7
  779.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  780.         move.l    (a0)+,d0    ; read first 12 (game) pixels
  781.         move.l    (a0)+,d1
  782.         move.l    (a0)+,d2
  783.         move.l    #$f0f0f0f0,d6
  784.         move.l    d0,d4
  785.         move.l    d2,d5
  786.         and.l    d6,d0        ; #$f0f0f0f0
  787.         eor.l    d0,d4
  788.         lsl.l    #4,d4
  789.         and.l    d6,d5        ; #$f0f0f0f0
  790.         eor.l    d5,d2
  791.         lsr.l    #4,d5
  792.         or.l    d5,d0
  793.         or.l    d4,d2        ; 00x02 -> 10 11
  794.  
  795.         move.l    d1,d4
  796.         and.l    d6,d1
  797.         eor.l    d1,d4
  798.         lsl.l    #4,d4
  799.         move.l    (a0)+,d3    ; read next 4
  800.         move.l    d3,d5
  801.         and.l    d6,d5
  802.         eor.l    d5,d3
  803.         lsr.l    #4,d5
  804.         or.l    d5,d1
  805.         or.l    d4,d3
  806.         lsl.l    #2,d0
  807.         or.l    d0,d1
  808.         move.l    d2,d4
  809.         move.l    #$cccccccc,d6
  810.         and.l    d6,d2
  811.         eor.l    d2,d4
  812.         lsl.l    #2,d4
  813.         bra    .same_from_here
  814.  
  815.         cnop    0,4
  816.  
  817. .outerloop    swap    d7
  818.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  819.  
  820. .innerloop    move.l    (a0)+,d0    ; read next 12 (game) pixels
  821.         move.l    (a0)+,d1
  822.         move.l    (a0)+,d2
  823.         move.l    d5,(a1)     ; 34 -> plane 3
  824.         adda.l    a6,a1        ; +bpmod
  825.         move.l    #$f0f0f0f0,d6
  826.         move.l    d0,d4
  827.         and.l    d6,d0
  828.         eor.l    d0,d4
  829.         lsl.l    #4,d4
  830.         move.l    d2,d5
  831.         and.l    d6,d5
  832.         eor.l    d5,d2
  833.         lsr.l    #4,d5
  834.         or.l    d5,d0
  835.         or.l    d4,d2
  836.         move.l    d1,d4
  837.         and.l    d6,d1
  838.         move.l    d3,(a1)     ; 33 -> plane 4
  839.         adda.l    a6,a1        ; +bpmod
  840.         eor.l    d1,d4
  841.         lsl.l    #4,d4
  842.         move.l    (a0)+,d3
  843.         move.l    d3,d5
  844.         and.l    d6,d5
  845.         eor.l    d5,d3
  846.         lsr.l    #4,d5
  847.         or.l    d5,d1
  848.         or.l    d4,d3
  849.         lsl.l    #2,d0
  850.         or.l    d0,d1
  851.         move.l    d2,d4
  852.         move.l    #$cccccccc,d6
  853.         and.l    d6,d2
  854.         eor.l    d2,d4
  855.         lsl.l    #2,d4
  856.         move.l    d6,(a1)
  857.         adda.l    a4,a1
  858. .same_from_here
  859.         move.l    d3,d5
  860.         and.l    d6,d5
  861.         eor.l    d5,d3
  862.         lsr.l    #2,d5
  863.         or.l    d5,d2
  864.         or.l    d4,d3
  865.         move.l    d3,d4
  866.         move.l    #$aaaaaaaa,d6
  867.         and.l    d6,d3
  868.         eor.l    d3,d4
  869.         move.l    d4,d5
  870.         add.l    d4,d4
  871.         or.l    d4,d5
  872.         move.l    d5,(a1)
  873.         adda.l    a6,a1
  874.         move.l    d3,d4
  875.         lsr.l    #1,d3
  876.         or.l    d3,d4
  877.         move.l    d2,d5
  878.         and.l    d6,d2
  879.         eor.l    d2,d5
  880.         move.l    d5,d6
  881.         add.l    d5,d5
  882.         move.l    d4,(a1)
  883.         adda.l    a6,a1
  884.         or.l    d5,d6
  885.         move.l    d2,d5
  886.         lsr.l    #1,d2
  887.         or.l    d2,d5
  888.         move.l    d1,d4
  889.         and.l    #$aaaaaaaa,d1
  890.         eor.l    d1,d4
  891.         move.l    d4,d3
  892.         move.l    d6,(a1)
  893.         adda.l    a6,a1
  894.         add.l    d4,d4
  895.         or.l    d4,d3
  896.         move.l    d1,d6
  897.         lsr.l    #1,d6
  898.         or.l    d1,d6
  899.         move.l    a3,a4
  900.         dbra    d7,.innerloop
  901.         move.l    a5,a4
  902.         swap    d7
  903.         dbra    d7,.outerloop
  904.         move.l    d5,(a1)
  905.         adda.l    a6,a1
  906.         move.l    d3,(a1)
  907.         adda.l    a6,a1
  908.         move.l    d6,(a1)
  909.         rts
  910.  
  911.         end
  912.